const fs = require('fs-extra')
const os = require('os')
const path = require('path')
const chalk = require('chalk')
const shell = require('shelljs')

const print = require('./print')

module.exports = {

    // 获取根路径
    getRootPath() {
        return path.join(__dirname, '../../')
    },

    getResourcesPath() {
        return path.join(this.getRootPath(), 'resources')
    },

    // 获取桌面路径  ~/Desktop
    getDesktopPath() {
        return path.join(os.homedir(), 'Desktop')
    },

    /*
     * 全局的配置文件夹：~/.fisher-tool/
     * 传入各个插件的配置文件，得到绝对路径
     */
    getConfigFilePath(fileName) {
        return path.join(os.homedir(), '.fihser-tool', fileName)
    },

    /*
     * 读取配置文件
     * - 不存在时，新建并写入内容，终止程序
     */
    readConfigFile(fileName, defaultContent = {}) {
        let filePath = this.getConfigFilePath(fileName)
        if (fs.existsSync(filePath)) { // 存在
            return JSON.parse(fs.readFileSync(filePath).toString())
        }else {
            // 连同文件夹一起创建
            fs.createFileSync(filePath)
            fs.writeFileSync(filePath, JSON.stringify(defaultContent, null, '\t'))
            print.successLog(`已成功创建 ${filePath}，请重新操作`)
            process.exit(1)
        }
    },

    // 读取 package.json
    getPackageInfo() {
        let result = {}
        try {
            result = JSON.parse(fs.readFileSync(path.join(this.getRootPath(), 'package.json')))
        } catch (e) {
            print.redLog('读取 package.json 出错！')
        }
        return result
    },

    /*
     * 异步执行 shell 命令，不输出 log，返回 promise
     */
    asyncExecShell(cmd) {
        return new Promise((resolve, reject) => {
            shell.exec(cmd, {silent: true}, function(code, stdout, stderr) {
                if (code != 0) { // 命令执行失败
                    reject(stderr || stdout)
                    return
                }
                resolve(stdout)
            })
        })    
    }
}